﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Linq;
using Entity;

namespace Data
{
    public class AmitieData
    {

        /// <summary>
        /// Ajoute une relation d'amitié entre deux utilisateurs.
        /// </summary>
        /// <param name="idutilisateur">Le premier utilisateur de la relation</param>
        /// <param name="idamis">Le second utilisateur de la relation</param>
        /// <param name="etat">L'état de la relation</param>
        public static void ajouterAmitie(int idutilisateur, int idamis, char etat)
        {
            ModeleDataContext mdl = DataContext.Context;

            Amitie amitie = new Amitie();
            amitie.idutilisateur = idutilisateur;
            amitie.idamis = idamis;
            amitie.etat = etat;

            mdl.Amitie.InsertOnSubmit(amitie);
            mdl.SubmitChanges();
        }

        /// <summary>
        /// Met à jour une relation d'amitié entre deux utilisateurs.
        /// </summary>
        /// <param name="idutilisateur">Le premier utilisateur de la relation</param>
        /// <param name="idamis">Le second utilisateur de la relation</param>
        /// <param name="etat">L'état de la relation</param>
        public static void majAmitie(int idutilisateur, int idamis, char etat)
        {
            ModeleDataContext mdl = DataContext.Context;

            Amitie amitie = getAmitie(idutilisateur, idamis);
            amitie.etat = etat;

            mdl.SubmitChanges();
        }

        /// <summary>
        /// Supprime une relation d'amitié entre deux utilisateurs.
        /// </summary>
        /// <param name="idutilisateur">Le premier utilisateur de la relation</param>
        /// <param name="idamis">Le second utilisateur de la relation</param>
        public static void supprimerAmitie(int idutilisateur, int idamis)
        {
            ModeleDataContext mdl = DataContext.Context;

            Amitie amitie = getAmitie(idutilisateur, idamis);

            mdl.Amitie.DeleteOnSubmit(amitie);
            mdl.SubmitChanges();
        }

        /// <summary>
        /// Retourne toutes les relations d'amitié d'un utilisateur pour un type donné.
        /// </summary>
        /// <param name="idutilisateur">L'utilisateur dont on veut obtenir les relations</param>
        /// <param name="etat">Le type des relations désirées</param>
        /// <returns>La liste des relations, ou null s'il n'y en a aucune</returns>
        public static List<AmitieUtilisateur> getAmities(int idutilisateur, char etat)
        {
            ModeleDataContext mdl = DataContext.Context;

            var sql = from a in mdl.Amitie
                      where
                            a.idutilisateur == idutilisateur
                            && a.etat == etat
                      orderby a.Utilisateur.nom
                      select new AmitieUtilisateur(a, a.Utilisateur);

            List<AmitieUtilisateur> amities = sql.ToList();

            if (amities.Count > 0)
                return amities;
            else
                return null;
        }

        /// <summary>
        /// Retourne, si elle existe, la relation d'amitié entre deux utilisateurs.
        /// </summary>
        /// <param name="idutilisateur">Le premier utilisateur de la relation</param>
        /// <param name="idamis">Le second utilisateur de la relation</param>
        /// <returns>La relation d'amitié si elle existe, null sinon</returns>
        public static Amitie getAmitie(int idutilisateur, int idamis)
        {
            ModeleDataContext mdl = DataContext.Context;



            var sql = from a in mdl.Amitie
                      where
                            a.idutilisateur == idutilisateur
                            && a.idamis == idamis
                      select a;

            List<Amitie> amities = sql.ToList();

            mdl.Refresh(RefreshMode.OverwriteCurrentValues, amities);

            if (amities.Count > 0)
                return amities[0];
            else
                return null;
        }
    }
}
